# 2021年1月18日星期一 上午8:47 周考2
# 人工智能学院1906A
# 裴云鹏

# 1.编写程序，实现以下功能：
# （1）构建一个空集合info_stu（4分）
# （2）从键盘依次添加5名同学的姓名、年龄和成绩，每个学生的姓名、年龄和成绩构成一个元组。（4分）
# （3）每个元组作为一个元素，加入集合info_stu中。
# （4）遍历输出中的内容格式为：（4分）
# 姓名：王一 ，年龄：18，成绩：89.5
# 姓名：张二 ，年龄：19，成绩：99.5
# 姓名：张三 ，年龄：18，成绩：87
# 姓名：刘四 ，年龄：17，成绩：82
# 姓名：姜五 ，年龄：19，成绩：91.5
# （5）用遍历循环方式，将这5名同学的年龄加入到空集合a中，并输出a
# （6）求出5名同学的平均分数


# -----------------------------------------------------------------------------------------
print('（1）构建一个空集合info_stu')
info_stu = set()


# -----------------------------------------------------------------------------------------
print('（2）从键盘依次添加5名同学的姓名、年龄和成绩，每个学生的姓名、年龄和成绩构成一个元组。（4分）\n'
      '（3）每个元组作为一个元素，加入集合info_stu中。')


def input_value(xtype, xprompt, xerror_prompt):
    '''
    Common procedure to receive user's input.

    :param xtype: The expected type.
    :param xprompt: The prompt.
    :param xerror_prompt: The prompt when cannot parse user's input as the specified type
    :return: The very value user inputted.
    '''
    while True:
        xinput = input(xprompt).strip()
        try:
            xinput = xtype(xinput)
            if str == xtype and len(xinput) == 0:
                print('不能为空白，请重新输入。')
                continue
            return xinput
        except ValueError:
            print(xerror_prompt)
            continue


cnt = 5
while True:
    print('已输入学生信息如下：')
    print(info_stu)
    xlen = len(info_stu)
    if xlen >= cnt:
        break
    print('您还需要输入{0}个学生的信息：'.format(cnt - xlen))
    xerror_prompt = '输入有误，请重新输入。'
    xname = input_value(str, '姓名?: ', xerror_prompt)
    xage = input_value(int, '年龄?: ', xerror_prompt)
    xscore = input_value(float, '成绩?: ', xerror_prompt)
    info_stu.add((xname, xage, xscore))


# -----------------------------------------------------------------------------------------
print('（4）遍历输出中的内容格式为：（4分）')
# 姓名：王一 ，年龄：18，成绩：89.5
# 姓名：张二 ，年龄：19，成绩：99.5
# 姓名：张三 ，年龄：18，成绩：87
# 姓名：刘四 ，年龄：17，成绩：82
# 姓名：姜五 ，年龄：19，成绩：91.5
for xname, xage, xscore in info_stu:
    print('姓名：{name}，年龄：{age}，成绩：{score}'.format(name=xname, age=xage, score=xscore))


# -----------------------------------------------------------------------------------------
print('（5）用遍历循环方式，将这5名同学的年龄加入到空集合a中，并输出a')
a = set()
for xstudent in info_stu:
    a.add(xstudent[1])
print('a = ', end='')
for xage in a:
    print(xage, end=', ')
print()


# -----------------------------------------------------------------------------------------
print('（6）求出5名同学的平均分数')
xlen = len(info_stu)
xsum = 0
for xname, xage, xscore in info_stu:
    xsum += xscore
xeva = xsum / xlen
print('平均分数为{:.2f}'.format(xeva))
